package Robot;

import java.awt.Image;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;

import Coleccionable.Baliza;
import Coleccionable.Coleccionable;
import Coleccionable.Cono;
import Premio.Premio;
import ProyectoX.Juego;
import ProyectoX.PanelConFondo;
import ProyectoX.Partida;
import ProyectoX.Tablero;

public abstract class Robot {
	
	protected int posx,maxx;
	protected int posy,maxy;
	protected char direccion;
	protected int energia;
	protected int maxEnergia;
	protected int municiones;
	protected ImageIcon ii;
	protected int id;
	protected int puntos;
	protected int balizas;
	protected int conos;
	protected boolean pincel;
	protected boolean color;
	
	protected Robot(int x,int y){
		posx=x;
		posy=y;
		direccion='r';
		puntos=0;
		balizas=0;
		conos=0;
		pincel=false;
		color=true;
	}
	
	/**
	 * Actualiza la posicion de el robot y le resta energia al robot
	 * @param c energia que se resta
	 */
	
	public void avanzar(int c){
		
		if(energia>0){
			switch(direccion)
			{
			case 'u':if(posy!=0)posy-=1;
					break;
			case 'd':posy+=1;
					break;
			case 'r':posx+=1;
					break;
			case 'l':if(posx!=0)posx-=1;
					break;
			}
			energia-=c;
			puntos++;
		}

	}
	/**
	 * agarra el coleccionable que tiene al frente
	 * @param t este parametro se utiliza para consultas
	 */
	public void agarrar(Tablero t){
		Coleccionable c=null;
		switch(direccion)
		{
		case 'u':if(posy>0&&t.getCasillero(posx, posy-1).getColeccionable()!=null){
					c=t.getCasillero(posx, posy-1).getColeccionable();
					t.getCasillero(posx, posy-1).setColeccionable(null);
				}
				break;
		case 'd':if(posy<9&&t.getCasillero(posx, posy+1).getColeccionable()!=null){
					c=t.getCasillero(posx, posy+1).getColeccionable();
					t.getCasillero(posx, posy+1).setColeccionable(null);
					}
				break;
		case 'r':if(posx<9&&t.getCasillero(posx+1, posy).getColeccionable()!=null){
					c=t.getCasillero(posx+1, posy).getColeccionable();
					t.getCasillero(posx+1, posy).setColeccionable(null);
					}
				break;
		case 'l':if(posx>0&&t.getCasillero(posx-1, posy).getColeccionable()!=null){
					c=t.getCasillero(posx-1, posy).getColeccionable();
					t.getCasillero(posx-1, posy).setColeccionable(null);
					}
				break;
		}
		if(c!=null)c.modBaul(this);

	}
	/**
	 *Descarga al frente del robot el cono que tiene guardado el baul 
	 * @param t este parametro se utiliza para consultas
	 */
	
	public void descargarCono(Tablero t){
		if(conos>0)
		switch(direccion)
		{
		case 'u':if(posy>0&&t.getCasillero(posx, posy-1).getTransitable()&&!t.esFinal(t.getCasillero(posx, posy-1))&&t.getCasillero(posx, posy-1).getPremio()==null){
					conos--;
					t.getCasillero(posx, posy-1).setColeccionable(new Cono());
					}
				break;
		case 'd':if(posy<9&&t.getCasillero(posx, posy+1).getTransitable()&&!t.esFinal(t.getCasillero(posx, posy+1))&&t.getCasillero(posx, posy+1).getPremio()==null){
					conos--;
					t.getCasillero(posx, posy+1).setColeccionable(new Cono());
					}
				break;
		case 'r':if(posx<9&&t.getCasillero(posx+1, posy).getTransitable()&&!t.esFinal(t.getCasillero(posx+1, posy))&&t.getCasillero(posx+1, posy).getPremio()==null){
					conos--;
					t.getCasillero(posx+1, posy).setColeccionable(new Cono());
					}
				break;
		case 'l':if(posx>0&&t.getCasillero(posx-1, posy).getTransitable()&&!t.esFinal(t.getCasillero(posx-1, posy))&&t.getCasillero(posx-1, posy).getPremio()==null){
					conos--;
					t.getCasillero(posx-1, posy).setColeccionable(new Cono());
					}
				break;
		}
	}
	/**
	 *Descarga al frente del robot el baliza que tiene guardado el baul 
	 * @param t este parametro se utiliza para consultas
	 */
	public void descargarBaliza(Tablero t){
		if(balizas>0)
		switch(direccion)
		{
		case 'u':if(posy>0&&t.getCasillero(posx, posy-1).getTransitable()&&!t.esFinal(t.getCasillero(posx, posy-1))&&t.getCasillero(posx, posy-1).getPremio()==null){
					balizas--;
					t.getCasillero(posx, posy-1).setColeccionable(new Baliza());
					}
				break;
		case 'd':if(posy<9&&t.getCasillero(posx, posy+1).getTransitable()&&!t.esFinal(t.getCasillero(posx, posy+1))&&t.getCasillero(posx, posy+1).getPremio()==null){
					balizas--;
					t.getCasillero(posx, posy+1).setColeccionable(new Baliza());
					}
				break;
		case 'r':if(posx<9&&t.getCasillero(posx+1, posy).getTransitable()&&!t.esFinal(t.getCasillero(posx+1, posy))&&t.getCasillero(posx+1, posy).getPremio()==null){
					balizas--;
					t.getCasillero(posx+1, posy).setColeccionable(new Baliza());
					}
				break;
		case 'l':if(posx>0&&t.getCasillero(posx-1, posy).getTransitable()&&!t.esFinal(t.getCasillero(posx-1, posy))&&t.getCasillero(posx-1, posy).getPremio()==null){
					balizas--;
					t.getCasillero(posx-1, posy).setColeccionable(new Baliza());
					}
				break;
		}
	}
	/**
	 * Abre el cofre que tiene el robot al frente
	 * @param t este parametro se utiliza para consultas
	 */
	public void abrirCofre(Tablero t){
		Premio p=null;
		switch(direccion)
		{
		case 'u':
			if(posy>0&&t.getCasillero(posx, posy-1).getObjeto()!=null)
					if(t.getCasillero(posx, posy-1).getObjeto().getPremio()!=null){
						p=t.getCasillero(posx, posy-1).getObjeto().getPremio();
						t.getCasillero(posx, posy-1).setObjeto(null);
						t.getCasillero(posx, posy-1).setPremio(p);		
					}
				break;
		case 'd':
			if(posy<9&&t.getCasillero(posx, posy+1).getObjeto()!=null)
				if(t.getCasillero(posx, posy+1).getObjeto().getPremio()!=null){
					p=t.getCasillero(posx, posy+1).getObjeto().getPremio();
					t.getCasillero(posx, posy+1).setObjeto(null);
					t.getCasillero(posx, posy+1).setPremio(p);
				}
				break;
		case 'r':
			if(posx<9&&t.getCasillero(posx+1, posy).getObjeto()!=null)
				if(t.getCasillero(posx+1, posy).getObjeto().getPremio()!=null){
					p=t.getCasillero(posx+1, posy).getObjeto().getPremio();
					t.getCasillero(posx+1, posy).setObjeto(null);
					t.getCasillero(posx+1, posy).setPremio(p);
				}
				break;
		case 'l':
			if(posx>0&&t.getCasillero(posx-1, posy).getObjeto()!=null)
				if(t.getCasillero(posx-1, posy).getObjeto().getPremio()!=null){
					p=t.getCasillero(posx-1, posy).getObjeto().getPremio();
					t.getCasillero(posx-1, posy).setObjeto(null);
					t.getCasillero(posx-1, posy).setPremio(p);
				}
				break;
		}
		
	}
	/**
	 * Si se puede el robot dispara  
	 * @param t este parametro se utiliza para consultas
	 * @param juego este parametro se utiliza para agregar la imagen del disparo
	 */
	public abstract void disparar(Juego juego,Tablero t);
	/**
	 * activa el pincel del robot
	 */
	public void activarPincel(){
		pincel=true;
	}
	/**
	 * desactiva el el pincel del robot
	 */
	public void desactivarPincel(){
		pincel=false;
	}
	/**
	 * Retorna si el pincel esta activado o no
	 * @return
	 */
	public boolean getPincel(){
		return pincel;
	}
	/**
	 * retorna el color del pincel
	 * @return 
	 */
	public boolean getColor(){
		return color;
	}
	/**
	 * cambia el color del pincel
	 */
	public void cambiarColor(){
		if(color)color=false;
		else color=true;
	}
	/**
	 * retorna la pos en x del robot
	 * @return
	 */
	
	public int getX(){
		return posx;
	}
	/**
	 * retorna la pos en y del robot
	 * @return
	 */
	public int getY(){
		return posy;
	}
	/**
	 * retorna la energiaMaxima del robot
	 */
	public int getEnergiaMax(){
		return maxEnergia;
	}
	/**
	 * gira el robot a la izquierda
	 */
	
	public void girarIzquierda(){
		switch(direccion)
		{
		case 'u':direccion='l';
				break;
		case 'd':direccion='r';
				break;
		case 'r':direccion='u';
				break;
		case 'l':direccion='d';
				break;
		}
		ii=new ImageIcon(this.getClass().getResource("/Robot/"+id+direccion+".png"));
	}
	
	/**
	 * gira el robot hacia la derecha
	 */
	
	public void girarDerecha(){
		switch(direccion)
		{
		case 'u':direccion='r';
				break;
		case 'd':direccion='l';
				break;
		case 'r':direccion='d';
				break;
		case 'l':direccion='u';
				break;
		}
		ii=new ImageIcon(this.getClass().getResource("/Robot/"+id+direccion+".png"));
	}
	/**
	 * retorna la energia actual del robot
	 * @return
	 */
	public int getEnergia(){
		return energia;
	}
	/**
	 * retorna la energia actual del robot en formato String
	 * @return
	 */
	public String getEnergiaS(){
		
		Integer i=energia;
		return i.toString();
	}
	/**
	 * retorna la imagen del robot
	 * @return
	 */
	public ImageIcon getII(){
		return ii;
	}
	
	public char getDireccion() {
		return direccion;
	}
	/**
	 * retorna los puntos del robot en formato String
	 * @return
	 */
	public String getPuntosS(){
		Integer p=puntos;
		
		return p.toString();
	}
	/**
	 * retorna la cantidad de balizas actual del robot en formato String
	 * @return
	 */
	public String getBalizasS(){
		Integer b=balizas;
		return b.toString();
	}
	/**
	 * retorna la cantidad de conos actual del robot en formato String
	 * @return
	 */
	public String getConosS(){
		Integer c=conos;
		return c.toString();
	}
	/**
	 * retorna la cantidad de municiones actual del robot en formato String
	 * @return
	 */
	public String getMunicionesS(){
		Integer m=municiones;
		return m.toString();
	}
	/**
	 * aumenta la cantidad de municiones del robotMilitar y los puntos del robotCivil
	 */
	public abstract void aumentarMuniciones();
	
	/**
	 * aumenta la cantidad de puntos en 10
	 */
	public void aumentarPuntos() {
		puntos+=10;
	}
	/**
	 * aumenta las balizas del baul en 1
	 */
	public void aumentarBaliza() {
		balizas++;
	}
	/**
	 * aumenta los conos del baul en 1
	 */
	public void aumentarCono() {
		conos++;	
	}
	/**
	 * aumenta la energia del robot en 1
	 */
	public void sumarEnergia() {
		energia+=15;
		
	}
	
}